package thread.pool;

import java.util.concurrent.*;

/**
 * @author weim
 * @date 18-8-30
 */
public class MyExecutorService {

    public static void main(String[] args) {

        ExecutorService executorServic4 = Executors.newSingleThreadExecutor();

        //创建一个可缓存线程池，如果线程池长度超过处理需要，可灵活回收空闲线程，若无可回收，则新建线程。
        ExecutorService executorService = Executors.newCachedThreadPool();
        //创建一个定长线程池，可控制线程最大并发数，超出的线程会在队列中等待。
        ExecutorService executorService1 = Executors.newFixedThreadPool(10);
        //创建一个定长线程池，支持定时及周期性任务执行。
        ExecutorService executorService2 = Executors.newScheduledThreadPool(10);
        //创建一个单线程化的线程池，它只会用唯一的工作线程来执行任务，保证所有任务按照指定顺序执行。
        ExecutorService executorServic3 = Executors.newSingleThreadExecutor();

        ScheduledThreadPoolExecutor service = new ScheduledThreadPoolExecutor(10);


//        for(int i=0; i<10; i++) {
//
//            final int index = i;
//
//            executorService.execute(() -> {
//                Thread.currentThread().setName(String.format("线程 %d run", index));
//                System.out.println(Thread.currentThread().getName());
//            });
//
//        }
//
//        Future<String> submits [] = new Future[10];
//        for(int i=0; i<10; i++) {
//
//            final int index = i;
//
//            Future<String> submit = executorService1.submit(() -> {
//                Thread.currentThread().setName(String.format("线程 %d run", index));
//                System.out.println(Thread.currentThread().getName());
//                try {
//                    Thread.sleep(1000*index);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                return "xian cheng ret " + index;
//            });
//
//            submits[i] = submit;
//        }
//
//        for(int i=0; i<10; i++) {
//            try {
//                System.out.println(submits[i].get());
//
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            } catch (ExecutionException e) {
//                e.printStackTrace();
//            }
//        }

        //延迟一秒执行
//        for(int i=0; i<10; i++) {
//
//            final int index = i;
//
//            service.schedule(() -> {
//                Thread.currentThread().setName(String.format("线程 %d run", index));
//                System.out.println(Thread.currentThread().getName());
//            }, 1000, TimeUnit.MILLISECONDS);
//
//        }

        //延迟一秒执行
        Future<String> submits [] = new Future[10];
        for(int i=0; i<10; i++) {

            final int index = i;

            Future<String> submit = service.schedule(() -> {
                Thread.currentThread().setName(String.format("线程 %d run", index));
                System.out.println(Thread.currentThread().getName());

                Thread.sleep(1000*index);

                return "xian cheng ret " + index;
            }, 1000, TimeUnit.MILLISECONDS);

            submits[i] = submit;
        }

        for(int i=0; i<10; i++) {
            try {
                System.out.println(submits[i].get());

            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }


    }

}
